package Principal;

import java.math.BigDecimal;
import java.util.Random;
//import java.util.Date;


public class BinaryBackoff {
	
	private int numeroColisao;
	private Random generator;
	private final float INTERVALO = 51.2F;
	
	public BinaryBackoff(int _sementeHost){
		numeroColisao = 0;
		generator = new Random(_sementeHost);
	}
	
	public int getNumeroColisoes(){
		return numeroColisao;
	}
	
	public void incrementaNumeroColisao(){
		numeroColisao++;
	}
	
	public BigDecimal gerarTempo(){
		double numeroAleatorio = geraNumeroAleatorio();
		
		if (numeroColisao <= 10){
			return new BigDecimal(calcularAtrasoRetransmissao(numeroAleatorio, numeroColisao));
		}
		return new BigDecimal(calcularAtrasoRetransmissao(numeroAleatorio,10));
	}
		
	public void resetBinaryBackoff(){
		numeroColisao = 0;
	}
	
	protected float calcularAtrasoRetransmissao(double intervaloTransmissao,int numeroColisoes){
		
		double numeroIntervalos = Math.pow(2,numeroColisoes);		
		
		double fracaoIntervalo = 1/(numeroIntervalos);
		double fimIntervalo = fracaoIntervalo;
		int numeroIntervalo = 0;
		while (intervaloTransmissao >= fimIntervalo){
			fimIntervalo += fracaoIntervalo;
			numeroIntervalo++;
		}
		return numeroIntervalo*INTERVALO;
	}

	private double geraNumeroAleatorio(){
		return generator.nextDouble();		
	}
	
}
